package ua.diploma.front;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import ua.diploma.core.Constants;
import ua.diploma.user.UserBean;
import static ua.diploma.core.Constants.ERROR_MESSAGE_ATTRIBUTE;
import static ua.diploma.core.Constants.ERROR_CONTEROOLER;
import static ua.diploma.core.Constants.USER_BEAN_ATTRIBUTE;

/**
 * FrontController получает все обычные http get/post запросы на приложение, а
 * затем он диспатчит их на другие контроллеры.
 * 
 * @author netstalk3r
 */
@WebServlet(name = "front", urlPatterns = { "/front/*" })
public class FrontController extends HttpServlet {

	private static final long serialVersionUID = -4833352250276936069L;

	/**
	 * логгер
	 */
	private static final Logger log = Logger.getLogger(FrontController.class);

	/**
	 * префикс к урлу который мы отрезаем когда форвардим на приватные
	 * контроллеры
	 */
	private static final String URI_PREFIX = "/webchat/front";

	/** префикс для приватных котроллеров */
	private static final String PRIVATE_PREFIX = "/private";

	/** префикс запроса на логин */
	private static final String LOGIN_PREFIX = "/front/"
			+ Constants.LOGIN_CONTROLLER;

	/**
	 * Конструктор по умолчанию
	 */
	public FrontController() {
		super();
	}

	/**
	 * Метод обрабатывает все завпросы
	 */
	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		final HttpServletRequest req = (HttpServletRequest) request;

		log.info("FrontController работает.");

		// задаем кодировку для ответа
		response.setCharacterEncoding("UTF-8");

		final String uri = req.getRequestURI();
		log.info("Request uri --> " + uri);

		// достаем из сессии бин
		UserBean userBean = (UserBean) req.getSession().getAttribute(
				USER_BEAN_ATTRIBUTE);

		// если пользоваетль не авторизованный и это запрос не аутентификацию и
		// не регистрацию, то отсылаем на страницу регистрации и аутентификации
		if (!userBean.isAuthorised()
				&& !uri.startsWith("/webchat/front/"
						+ Constants.LOGIN_CONTROLLER)
				&& !uri.startsWith("/webchat/front/"
						+ Constants.REGISTRATION_CONTROLLER)
				&& !uri.startsWith("/webchat/front/"
						+ Constants.WHIPUP_CONTROLLER)) {
			log.info("Неавторизированный пользователь ----> перенаправление");
			request.getRequestDispatcher(LOGIN_PREFIX).forward(request,
					response);
			return;
		}

		// если запрос построен правильно то у него в начале идет доп префикс от
		// фронта
		if (uri.startsWith(URI_PREFIX)) {
			// создаем урл к нужному контроллеру
			String contollerURI = PRIVATE_PREFIX
					+ req.getRequestURI().substring(URI_PREFIX.length());
			log.info("Правильный запрос ----> " + contollerURI);
			request.getRequestDispatcher(contollerURI).forward(request,
					response);
		} else {
			// форвардим на контроллер обработки ошибок
			log.info("Неправильный запрос ----> " + uri);
			request.setAttribute(ERROR_MESSAGE_ATTRIBUTE,
					"Неправильный запрос.");
			request.getRequestDispatcher(ERROR_CONTEROOLER).forward(request,
					response);
		}
	}
}
